# pd.Period 和 pd.PeriodIndex 的使用
"""
常用的Period方法

时期表示的是时间区间，比如 年/季/月/日/时/分 等
通过加减整数可以实现对Period的移动
PeriodIndex 类的构造函数允许直接使用一组字符串表示一段时期
许多季度型数据会涉及“财年末”的概念，通常是一年12个月中某月的最后一个工作日或日历日
"""
# Period表示时间跨度（例如,一天,一个月,四分之一等）。
# 用freq=频率别名指定范围。freq代表一个跨度Period,它不能像“-3D”那样
import pandas as pd
import numpy as np

# pd.Period(‘0000-00-00 00:00:00’, freq = ‘Y/Q/M/W/D/H’)
# pd.Period(, freq = 'Y') Year年度
y = pd.Period("2023", freq="Y")
print(y)
print("开始时间：", y.start_time)
print("结束时间：", y.end_time)
print("是否是闰年：", y.is_leap_year)

# pd.Period(, freq = 'Q') Quarter季度
q1 = pd.Period("2023q1", freq="q-dec")  # freq='q-dec' 最后一个季度是12月份
print(q1)
print("开始时间：", q1.start_time)
print("结束时间：", q1.end_time)

print(q1.asfreq('M'))  # 把季度转换成月份，默认 how = 'end'
print(q1.asfreq('M', how='start'))
print(q1.asfreq('M', how='end'))

# pd.Period(, freq = 'M') Month月度
m = pd.Period('2023-06')
print("开始时间：", m.start_time)
print("结束时间：", m.end_time)
print(m + 1)  # 按月进行加减

# pd.Period(, freq = 'W') Week周度
w = pd.Period('2023-06-06', freq='W')
print(w)  # 输出这一周的日期
print("开始时间：", w.start_time)
print("结束时间：", w.end_time)
print(w - 1)  # 前一周的日期

# pd.Period(, freq = 'D') Day日度
pass

# pd.Period(, freq = 'H') Hour时度
pass

# pd.Period(, freq = 's') Second 秒
s = pd.Period('2023-06-06 12:00:00', freq='s')
print(s)
print(s.start_time)
print(s.end_time)

# 转换
p = pd.Period('2023-06-01 09:00', freq='H')

print(p.asfreq('D', how='start'))  # Period('2023-06-01', 'D')将周期转换为所需频率
print(p.to_timestamp(how='end'))  # Timestamp('2023-06-01 09:59:59')时间段转时间戳
print(p.now(freq='S'))  # Period('2023-06-28 16:29:46', 'S') 必须指定freq
print(p.strftime('%Y-%m-%d %H:%M:%S'))  # '2023-06-01 09:00:00'


# pd.period_range() 的用法
r = pd.period_range("2022", "2023", freq="q")  # 用法和 .date_range 类似，产生一系列数组
print(r)
print(r[0])
print(r[0].start_time)
print(r[0].end_time)

r1 = pd.period_range(start='2020', end='2023', freq='3m')  # 也可以按照每3个月跳跃
print(r1)
print(r1[0])
print(r1[0].start_time)
print(r1[0].end_time)
ps = pd.Series(
    data=np.random.randn(len(r1)),
    index=r1  # 以 r1作为 index
)
print(ps)
print(ps['2020'])  # 分区索引，直接把所有2020年的数据拿出来
print(ps['2021-05': '2022-08'])  # 分区索引，把一个期间的数据拿出来
